home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / copy_reg.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  5KB  |  187 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Helper to provide extensibility for pickle/cPickle.
  5.  
  6. This is only useful to add pickle support for extension types defined in
  7. C, not for instances of user-defined classes.
  8. '''
  9. from types import ClassType as _ClassType
  10. __all__ = [
  11.     'pickle',
  12.     'constructor',
  13.     'add_extension',
  14.     'remove_extension',
  15.     'clear_extension_cache']
  16. dispatch_table = { }
  17.  
  18. def pickle(ob_type, pickle_function, constructor_ob = None):
  19.     if type(ob_type) is _ClassType:
  20.         raise TypeError('copy_reg is not intended for use with classes')
  21.     
  22.     if not callable(pickle_function):
  23.         raise TypeError('reduction functions must be callable')
  24.     
  25.     dispatch_table[ob_type] = pickle_function
  26.     if constructor_ob is not None:
  27.         constructor(constructor_ob)
  28.     
  29.  
  30.  
  31. def constructor(object):
  32.     if not callable(object):
  33.         raise TypeError('constructors must be callable')
  34.     
  35.  
  36.  
  37. try:
  38.     complex
  39. except NameError:
  40.     pass
  41.  
  42.  
  43. def pickle_complex(c):
  44.     return (complex, (c.real, c.imag))
  45.  
  46. pickle(complex, pickle_complex, complex)
  47.  
  48. def _reconstructor(cls, base, state):
  49.     if base is object:
  50.         obj = object.__new__(cls)
  51.     else:
  52.         obj = base.__new__(cls, state)
  53.         base.__init__(obj, state)
  54.     return obj
  55.  
  56. _HEAPTYPE = 512
  57.  
  58. def _reduce_ex(self, proto):
  59.     if not proto < 2:
  60.         raise AssertionError
  61.     for base in self.__class__.__mro__:
  62.         if hasattr(base, '__flags__') and not (base.__flags__ & _HEAPTYPE):
  63.             break
  64.             continue
  65.     else:
  66.         base = object
  67.     if base is object:
  68.         state = None
  69.     elif base is self.__class__:
  70.         raise TypeError, "can't pickle %s objects" % base.__name__
  71.     
  72.     state = base(self)
  73.     args = (self.__class__, base, state)
  74.     
  75.     try:
  76.         getstate = self.__getstate__
  77.     except AttributeError:
  78.         if getattr(self, '__slots__', None):
  79.             raise TypeError('a class that defines __slots__ without defining __getstate__ cannot be pickled')
  80.         
  81.         
  82.         try:
  83.             dict = self.__dict__
  84.         except AttributeError:
  85.             dict = None
  86.         except:
  87.             None<EXCEPTION MATCH>AttributeError
  88.         
  89.  
  90.         None<EXCEPTION MATCH>AttributeError
  91.  
  92.     dict = getstate()
  93.     if dict:
  94.         return (_reconstructor, args, dict)
  95.     else:
  96.         return (_reconstructor, args)
  97.  
  98.  
  99. def __newobj__(cls, *args):
  100.     return cls.__new__(cls, *args)
  101.  
  102.  
  103. def _slotnames(cls):
  104.     """Return a list of slot names for a given class.
  105.  
  106.     This needs to find slots defined by the class and its bases, so we
  107.     can't simply return the __slots__ attribute.  We must walk down
  108.     the Method Resolution Order and concatenate the __slots__ of each
  109.     class found there.  (This assumes classes don't modify their
  110.     __slots__ attribute to misrepresent their slots after the class is
  111.     defined.)
  112.     """
  113.     names = cls.__dict__.get('__slotnames__')
  114.     if names is not None:
  115.         return names
  116.     
  117.     names = []
  118.     if not hasattr(cls, '__slots__'):
  119.         pass
  120.     else:
  121.         for c in cls.__mro__:
  122.             if '__slots__' in c.__dict__:
  123.                 slots = c.__dict__['__slots__']
  124.                 if isinstance(slots, basestring):
  125.                     slots = (slots,)
  126.                 
  127.                 for name in slots:
  128.                     if name in ('__dict__', '__weakref__'):
  129.                         continue
  130.                         continue
  131.                     if name.startswith('__') and not name.endswith('__'):
  132.                         names.append('_%s%s' % (c.__name__, name))
  133.                         continue
  134.                     names.append(name)
  135.                 
  136.         
  137.     
  138.     try:
  139.         cls.__slotnames__ = names
  140.     except:
  141.         pass
  142.  
  143.     return names
  144.  
  145. _extension_registry = { }
  146. _inverted_registry = { }
  147. _extension_cache = { }
  148.  
  149. def add_extension(module, name, code):
  150.     '''Register an extension code.'''
  151.     code = int(code)
  152.     if code <= code:
  153.         pass
  154.     elif not code <= 2147483647:
  155.         raise ValueError, 'code out of range'
  156.     
  157.     key = (module, name)
  158.     if _extension_registry.get(key) == code and _inverted_registry.get(code) == key:
  159.         return None
  160.     
  161.     if key in _extension_registry:
  162.         raise ValueError('key %s is already registered with code %s' % (key, _extension_registry[key]))
  163.     
  164.     if code in _inverted_registry:
  165.         raise ValueError('code %s is already in use for key %s' % (code, _inverted_registry[code]))
  166.     
  167.     _extension_registry[key] = code
  168.     _inverted_registry[code] = key
  169.  
  170.  
  171. def remove_extension(module, name, code):
  172.     '''Unregister an extension code.  For testing only.'''
  173.     key = (module, name)
  174.     if _extension_registry.get(key) != code or _inverted_registry.get(code) != key:
  175.         raise ValueError('key %s is not registered with code %s' % (key, code))
  176.     
  177.     del _extension_registry[key]
  178.     del _inverted_registry[code]
  179.     if code in _extension_cache:
  180.         del _extension_cache[code]
  181.     
  182.  
  183.  
  184. def clear_extension_cache():
  185.     _extension_cache.clear()
  186.  
  187.